'use strict';

const BaseService = require('./base');

class AddressService extends BaseService {
  constructor(ctx) {
    super(ctx, 'Address');
  }

  // 获取会员的收货地址列表
  async getMemberAddresses(memberId) {
    return await this.ctx.model.Address.findAll({
      where: { memberId },
      order: [
        ['isDefault', 'DESC'],
        ['createdAt', 'DESC']
      ],
    });
  }

  // 创建收货地址
  async createAddress(data) {
    const { ctx } = this;
    const { memberId, isDefault } = data;

    // 如果设置为默认地址，需要将其他地址设置为非默认
    if (isDefault) {
      await this.resetDefaultAddress(memberId);
    }

    return await ctx.model.Address.create(data);
  }

  // 更新收货地址
  async updateAddress(id, memberId, data) {
    const { ctx } = this;
    const { isDefault } = data;
    const address = await ctx.model.Address.findOne({
      where: { id, memberId },
    });

    if (!address) {
      throw new Error('收货地址不存在');
    }

    // 如果设置为默认地址，需要将其他地址设置为非默认
    if (isDefault) {
      await this.resetDefaultAddress(memberId);
    }

    return await address.update(data);
  }

  // 删除收货地址
  async deleteAddress(id, memberId) {
    const { ctx } = this;
    const address = await ctx.model.Address.findOne({
      where: { id, memberId },
    });

    if (!address) {
      throw new Error('收货地址不存在');
    }

    // 如果删除的是默认地址，则将最新的地址设为默认
    if (address.isDefault) {
      const newDefault = await ctx.model.Address.findOne({
        where: { memberId, id: { [ctx.app.Sequelize.Op.ne]: id } },
        order: [['createdAt', 'DESC']],
      });
      if (newDefault) {
        await newDefault.update({ isDefault: true });
      }
    }

    return await address.destroy();
  }

  // 设置默认地址
  async setDefaultAddress(id, memberId) {
    const { ctx } = this;
    const address = await ctx.model.Address.findOne({
      where: { id, memberId },
    });

    if (!address) {
      throw new Error('收货地址不存在');
    }

    // 将其他地址设置为非默认
    await this.resetDefaultAddress(memberId);

    // 设置新的默认地址
    return await address.update({ isDefault: true });
  }

  // 重置默认地址
  async resetDefaultAddress(memberId) {
    const { ctx } = this;
    await ctx.model.Address.update(
      { isDefault: false },
      { where: { memberId } }
    );
  }
}

module.exports = AddressService;
